/*!
 * @Author: CPS
 * @email: 373704015@qq.com
 * @Date: 2020-08-13 23:06:14
 * @Last Modified by: CPS
 * @Last Modified time: 2020-08-27 22:08:38
 * @Projectname Electron-fileWatcher
 * @file_path "D:\CPS\MyProject\Electron-fileWatcher\src\renderer\app\fielWatcherObject\index.js"
 * @Filename "index.js"
 * 创建后台所需要的数据对象
 */
'use strict'

import {
  EventEmitter
} from 'events'

import path from 'path'
import fs from 'fs'

import settings from './settings.js'
import defaultSttings from './defaultSettings.js'

const HOME_PATH = process.env.HOME
const YYS_CPS_PATH = path.resolve(HOME_PATH, 'cps')
const YYS_CONFIG_PATH = path.resolve(HOME_PATH, 'cps', "fileWatcher")

//创建事件对象
class configObject extends EventEmitter {
  constructor() {
    super()
    //软件默认配置[内部配置 软件部分]
    this.loaclSettings = defaultSttings

    //软件默认配置[外部配置 用户部分]
    this.settings = settings

    //读取本地配置文件
    this.loadLocal()

    //读取用户配置文件
    this.loadUser()
  }

  /*获取本地配置文件*/
  loadLocal() {
    //本地配置目录
    let localPath = this['loaclSettings']['configPath']
    if (!check_dir(localPath)) return log('发生错误了')

    // 读取软件默认配置文件(存在则读取,不存在则创建)
    let loaclSettings = path.resolve(this.loaclSettings['configPath'], 'loaclSettings.json')
    let tmpLocal = this.localSettings(loaclSettings)
    if (tmpLocal) Object.assign(this.loaclSettings, tmpLocal)
  }

  /*读取用户配置文件*/
  loadUser() {
    // 读取用户配置(如果存在)
    let userSettings = path.resolve(this.loaclSettings['configPath'], 'userSettings.json')
    let tmpUser = this.localSettings(userSettings)
    if (tmpUser) Object.assign(this.settings, tmpUser)
  }

  // 保存本地配置文件
  saveLocalSettings() {
    this.saveSettings(
      oaclSettings['configPath'],
      'loaclSettings.json',
      this.loaclSettings)
  }

  // 保存用户配置文件
  saveUserSettings(options) {
    this.settings['configName'] = options.name //设置一个配置文件的保存时间
    this.settings['lastSaveTime'] = 124 //设置一个配置文件的保存时间
    this.saveSettings(options.path, options.name, this.settings)
  }

  // 读取配置
  localSettings(configPath) {
    if (!configPath) return log('需要输入一个文件作为参数')

    // 验证文件是否存在
    if (!fs.existsSync(configPath)) {
      log('文件不合法,或者不存在')
      return
    }

    // 返回json格式的配置文件
    return JSON.parse(fs.readFileSync(configPath))
  }

  //
  // 保存配置到文件
  //
  // @param      {string}  savePath  要保存的文件名
  // @param      {object}  data      要保存的对象
  // @return     {<type>}  { description_of_the_return_value }
  //
  saveSettings(savePath, name, data) {
    if (!name) return log('需要输入一个目文件作为参数')

    // 保存用户配置文件
    fs.writeFile(
      path.resolve(savePath, name),
      JSON.stringify(data, null, 2),
      (err) => {
        if (err) log(`保存配置文件出错：${savePath}`);
      })
  }
}

/*检测目录,不存在则创建,失败反正false*/
function check_dir(tar) {
  let res
  if (!fs.existsSync(tar)) {
    // 如果tar不存在,自动创建
    try {
      res = fs.mkdirSync(tar)
    } catch (e) {
      // statements
      log('创建失败:' + e);
    }
    return res
  }
  return true
}

/*检测文件,如果不存在,则创建*/
function check_file(tar, data = '') {
  let res
  if (!fs.existsSync(tar)) {
    try {
      res = fs.writeFileSync(tar, data)
    } catch (e) {
      // statements
      log(e);
    }
    return res
  }
  return true
}


export default () => {
  log('++尝试载入++ configObject')

  // 确保对象全局唯一性
  if (!global.configObject) {
    log('--创建configObject')
    global.configObject = new configObject()
  }

  return global.configObject
}